Arithmetic Operations: Manipulating Returned Parameters

The most common placement problems occur when labels are used or closed structures, such as loops, are included. We've seen numerous examples of loops. Those which involve fermions and, to a lesser extent scalars, are most easily constructed. Re-examining the example in section 2.10.2 and the problems posed at the conclusions of sections 2.9.2, 2.10.2, and 2.12 we note one thing in common. Each involves drawing a fermion which is the same (or a simple constant times the) length of a gluon or photon. These make use of the various \length parameters which are returned when a line is drawn: \gluonlengthx, \gluonlengthy, \photonlengthx, \photonlengthy, \fermionlengthx, \fermionlengthy, \scalarlengthx, and \scalarlengthy, as well as \plengthx and \plengthy, which correspond to the previous line. Each of these has a sign and magnitude depending upon the direction drawn. \fermionlength is an especially useful additional measure whose length is always positive and equal to the entire length of the previously drawn fermion. It is often more difficult to prepare loops when the statement has been used since only the length of one line is recorded. This was evident in the example is section 3.8.2.

It is often desirable to know the separation of two arbitrary points, perhaps on two different Feynman diagrams or between points in different sub-branches of a single diagram. Since these points will, in general, be at co-ordinates unknown to the user, the ability to perform simple arithmetic within the TEX file is needed.

TEX defines the following useful commands:

\global\advance  <variable name> by <increment  (number or variable)>
\global\multiply <variable name> by <multiplier (number or variable)>
\global\divide   <variable name> by <divisor    (number or variable)>
where, as usual, <,> are not part of the syntax. In addition provides:
\negate       <variable name>
\double       <variable name>
\multroothalf <variable name>

In each case the variable name, such as fermionlength, will be an integer and the result will be an integer (rounded). The first three add, multiply and divide respectively. The second three multiply by minus one, multiply by two, and multiply by ${\frac{{1}}{{\sqrt2}}}$ respectively. Each represents an action, not a result. Thus to subtract Y from X you would enter

\negate\Y
\global\advance \X by \Y
but not: \global\advance \X by \negate\Y. (For the cognoscente you must expand the token ``negate Y'' first). Note that LATEX defines the commands:
\newcounter{<variable name>}
\setcounter{<variable name><variable value}
\addtocounter{<variable name><increment>}
but that \addtocounter should not be used with unless the variable has been user-defined (see section 4.2) with newcounter.

As an example consider labelling the midpoint of a particle line. Suppose that the following is desired:


\begin{picture}(8000,8000)
\drawline\photon[\NE\REG](0,0)[10]
\global\advance\pm...
...by 650
\global\advance\pmidy by -450
\put(\pmidx,\pmidy){$\gamma$}
\end{picture}


Where the label is at the midpoint of the photon on the lower side. The true (geometric) midpoint is at the co-ordinates (pmidx,pmidy). However if we try:

\begin{picture}(8000,8000)
\drawline\photon[\NE\REG](0,0)[10]
\put(\pmidx,\pmidy){$\gamma$}
\end{picture}
we'd produce:


\begin{picture}(8000,8000)
\drawline\photon[\NE\REG](0,0)[10]
\put(\pmidx,\pmidy){$\gamma$}
\end{picture}


One would like to move the `γ' about two millimeters to the right and about one and a half millimeters down. This may be readily accomplished with:

\begin{picture}(8000,8000)
\drawline\photon[\NE\REG](0,0)[10]
\global\advance\pmidx by 650
\global\advance\pmidy by -450
\put(\pmidx,\pmidy){$\gamma$}
\end{picture}
The exact values used are a question of style and one will frequently experiment to achieve particular æstetics.

A frequent use of multroothalf occurs when one desires to make a horizontal or vertical line the same length as a slanted line (or vice-versa). As a simple exercise, reproduce the following diagram for Delbrück scattering where all lines are of precisely the same length. Begin by drawing a photon.


\begin{picture}(10000,10000)(0,0)
\drawline\photon[\SE\FLIPPED](0,5000)[6]
\doub...
...wline\fermion[\N\REG](\photonfrontx,\photonfronty)[\fermionlength]
\end{picture}
As a final example we consider the following case, which is the lowest order QED correction to Coulomb scattering of a lepton from a nucleus which distinguishes between a positron and an electron.
\begin{picture}(10000,10000)(0,0)
\THICKLINES
\drawline\photon[\NE\REG](5000,0)[...
...-500)[10000]
\drawline\fermion[\W\REG](\fermionbackx,-1000)[10000]
\end{picture}
Here the problem is how to space the two photon lines, which differ in length by three half-wiggles, such that both will connect smoothly to the fermions. To facilitate this we introduce two new variables which are returned by and (and also by drawloop): unitboxwidth and unitboxheight. They are (respectively) the width and height (x and y extents) of the smallest complete unit of the previously line. For a gluon this is one loop, for a photon an entire wiggle, for a scalar one segment plus one gap and for a fermion the entire length. Of course one can equally well use a

\global\divide\gluonlengthx by <number of loops>
and so forth to obtain the equivalent value. Using these the above may be quickly drawn:
\hskip 0.75in
\begin{picture}(10000,10000)(0,0)
\THICKLINES
\drawline\photon[\NE\REG](5000,0)[6]
\multiply\unitboxheight by 3
\multroothalf\unitboxheight 
\drawline\fermion[\E\REG](\photonbackx,\photonbacky)[\unitboxheight]
\drawline\fermion[\NW\REG](\photonbackx,\photonbacky)[\fermionlength]
\drawline\fermion[\N\REG](\fermionbackx,\fermionbacky)[\fermionlength]
\drawline\photon[\SW\FLIPPED](\fermionfrontx,\fermionfronty)[9]
\drawline\fermion[\E\REG](\photonbackx,\photonbacky)[7000]
\drawline\fermion[\W\REG](\photonbackx,\photonbacky)[3000]
\drawline\fermion[\E\REG](\fermionbackx,-500)[10000]
\drawline\fermion[\W\REG](\fermionbackx,-1000)[10000]
\end{picture}
Since ``particlelengthx'', represent the extent, or increment, of the previous line they are often negative. For a gluon drawn in the SW direction, for instance, both gluonlengthx and gluonlengthy are negative. When using these to compare lengths one must generally employ the ``negate'' command. An alternative is to use boxlengthx and boxlengthy which give the absolute magnitudes of the length parameters. There are a few instances, however, where the two might not match (see the sections on stems and caps).

The placement of arrows sometimes requires fine adjustments as well. As an additional exercise try to draw the following as closely as possible. Use a 12-point document size.

Drell-Yan W-Production


\begin{picture}(10000,10000)
% bigphotons
\THICKLINES
\drawline\photon[\E\REG](5...
...](\pmidx,\pmidy)
\advance \pmidx by -1200
\put(\pmidx,2300){$\nu$}
\end{picture}